/* * CDDL HEADER START * * The contents of this file are subject to the terms of the Common Development * and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at * src/com/vodafone360/people/VODAFONE.LICENSE.txt or * http://github.com/360/360-Engine-for-Android * See the License for the specific language governing permissions and * limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each file and * include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the fields * enclosed by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved. * Use is subject to license terms. */ package com.vodafone360.people.tests.engine.contactsync; import java.util.ArrayList; import java.util.List; import android.app.Instrumentation; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.provider.Contacts; import android.provider.Contacts.People; import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.Suppress; import android.util.Log; import com.vodafone360.people.MainApplication; import com.vodafone360.people.Settings; import com.vodafone360.people.database.DatabaseHelper; import com.vodafone360.people.database.tables.ContactDetailsTable; import com.vodafone360.people.database.tables.ContactSummaryTable; import com.vodafone360.people.database.tables.ContactsTable; import com.vodafone360.people.database.tables.ContactDetailsTable.Field; import com.vodafone360.people.database.tables.ContactsTable.ContactIdInfo; import com.vodafone360.people.datatypes.Contact; import com.vodafone360.people.datatypes.ContactDetail; import com.vodafone360.people.datatypes.ContactSummary; import com.vodafone360.people.datatypes.VCardHelper; import com.vodafone360.people.engine.EngineManager.EngineId; import com.vodafone360.people.engine.contactsync.FetchNativeContacts; import com.vodafone360.people.engine.contactsync.IContactSyncCallback; import com.vodafone360.people.service.ServiceStatus; import com.vodafone360.people.tests.TestModule; import com.vodafone360.people.tests.TestModule.NativeContactDetails; import com.vodafone360.people.tests.TestModule.NativeDetail; import com.vodafone360.people.tests.engine.EngineTestFramework; import com.vodafone360.people.tests.engine.IEngineTestFrameworkObserver; import com.vodafone360.people.tests.engine.contactsync.DummyContactSyncEngine; import com.vodafone360.people.utils.LogUtils; @SuppressWarnings("deprecation") public class FetchNativeContactsTest extends InstrumentationTestCase implements IEngineTestFrameworkObserver { private static final String LOG_TAG = "FetchNativeContactsTest"; private static final long MAX_PROCESSOR_TIME = 30000000; private static final String ADD_CONTACT_TEST_NAME = "Joe Stephen Bloggs"; private static final String ADD_CONTACT_TEST_NOTE = "This is a test note for the first test contact"; private static final String ADD_PHONE_TEST1 = "+441928237372"; private static final int ADD_PHONE_TYPE_TEST1 = Contacts.Phones.TYPE_HOME; private static final ContactDetail.DetailKeyTypes ADD_PHONE_PEOPLE_TYPE_TEST1 = ContactDetail.DetailKeyTypes.HOME; private static final String ADD_PHONE_TEST2 = "019283373663"; private static final int ADD_PHONE_TYPE_TEST2 = Contacts.Phones.TYPE_OTHER; private static final ContactDetail.DetailKeyTypes ADD_PHONE_PEOPLE_TYPE_TEST2 = null; private static final String ADD_PHONE_TEST3 = "0122-202928-2283"; private static final int ADD_PHONE_TYPE_TEST3 = Contacts.Phones.TYPE_WORK; private static final ContactDetail.DetailKeyTypes ADD_PHONE_PEOPLE_TYPE_TEST3 = ContactDetail.DetailKeyTypes.WORK; private static final String ADD_CM_TEST1 = "kdfkddfk@skdjkddd.co.uk"; private static final int ADD_CM_TYPE_TEST1 = Contacts.ContactMethods.TYPE_HOME; private static final int ADD_CM_KIND_TEST1 = 1; private static final ContactDetail.DetailKeyTypes ADD_CM_PEOPLE_TYPE_TEST1 = ContactDetail.DetailKeyTypes.HOME; private static final String ADD_CM_TEST2 = "18 Styal Road, Wilmslow, Manchester, M22 2AL, United Kingdom"; private static final int ADD_CM_TYPE_TEST2 = Contacts.ContactMethods.TYPE_WORK; private static final int ADD_CM_KIND_TEST2 = 2; private static final String ADD_CM_TEST2_ADDRESS1 = "18 Styal Road"; private static final String ADD_CM_TEST2_ADDRESS2 = "Wilmslow"; private static final String ADD_CM_TEST2_ADDRESS_CITY = "Manchester"; private static final String ADD_CM_TEST2_ADDRESS_COUNTY = ""; private static final String ADD_CM_TEST2_ADDRESS_POSTCODE = "M22 2AL"; private static final String ADD_CM_TEST2_ADDRESS_COUNTRY = "United Kingdom"; private static final ContactDetail.DetailKeyTypes ADD_CM_PEOPLE_TYPE_TEST2 = ContactDetail.DetailKeyTypes.WORK; private static final String ADD_ORG_COMPANY_TEST1 = "Mobica Ltd"; private static final String ADD_ORG_TITLE_TEST1 = "Software Engineer"; private static final int ADD_ORG_TYPE_TEST1 = Contacts.Organizations.TYPE_CUSTOM; private static final String ADD_ORG_LABEL_TEST1 = "Custom"; private static final ContactDetail.DetailKeyTypes ADD_ORG_PEOPLE_TYPE_TEST1 = null; private static final String MODIFY_CONTACT_TEST_NAME = "AnotherContactName!\"%^&*()_+"; private static final String MODIFY_PHONE_TEST1 = "203938937373338383838"; private static final String MODIFY_EMAIL_TEST1 = "skdfjksdfjkldskl@sdfdsksdklfjdkl.co.uk"; private static final String MODIFY_COMPANY_TEST1 = "Motorola Ltd"; private static final String MODIFY_PHONE_TEST2 = "+44192827367363"; private static final int MODIFY_PHONE_TYPE_TEST2 = Contacts.Phones.TYPE_FAX_HOME; private static final ContactDetail.DetailKeyTypes MODIFY_PHONE_PEOPLE_TYPE_TEST2 = ContactDetail.DetailKeyTypes.FAX; private static final String MODIFY_EMAIL_TEST2 = "typical_email.address@email.com"; private static final int MODIFY_EMAIL_TYPE_TEST2 = Contacts.ContactMethods.TYPE_OTHER; private static final ContactDetail.DetailKeyTypes MODIFY_EMAIL_PEOPLE_TYPE_TEST2 = null; private static final int MODIFY_EMAIL_KIND_TEST2 = 1; private static final String MODIFY_COMPANY_TEST2 = "sdkfsdfjklsdfkldfkjl"; private static final String MODIFY_TITLE_TEST2 = "Database administrator"; private static final int MODIFY_COMPANY_TYPE_TEST2 = Contacts.Organizations.TYPE_WORK; private static final ContactDetail.DetailKeyTypes MODIFY_COMPANY_PEOPLE_TYPE_TEST2 = ContactDetail.DetailKeyTypes.WORK; private static final int BULK_TEST_NO_CONTACTS = 100; private static final String DUP_CONTACT_NAME = "Abc"; private static final String DUP_CONTACT_NUMBER = "800123455454"; EngineTestFramework mEngineTester = null; MainApplication mApplication = null; DummyContactSyncEngine mEng = null; FetchNativeContactsProcessorTest mProcessor = null; ContentResolver mCr = null; DatabaseHelper mDb = null; class FetchNativeContactsProcessorTest extends FetchNativeContacts { FetchNativeContactsProcessorTest(IContactSyncCallback callback, DatabaseHelper db, Context context, ContentResolver cr) { super(callback, db); } } TestModule mTestModule = new TestModule(); int mTestStep; @Override protected void setUp() throws Exception { super.setUp(); mApplication = (MainApplication)Instrumentation.newApplication(MainApplication.class, getInstrumentation().getTargetContext()); mApplication.onCreate(); mDb = mApplication.getDatabase(); mDb.removeUserData(); mCr = mApplication.getContentResolver(); mEngineTester = new EngineTestFramework(this); mEng = new DummyContactSyncEngine(mEngineTester); mProcessor = new FetchNativeContactsProcessorTest(mEng, mApplication.getDatabase(), mApplication, mCr); mEng.setProcessor(mProcessor); mEngineTester.setEngine(mEng); try { mCr.delete(People.CONTENT_URI, null, null); } catch (IllegalArgumentException e) { Cursor c = mCr.query(People.CONTENT_URI, new String[] { People._ID }, null, null, null); while (c.moveToNext()) { Uri uri = ContentUris.withAppendedId(Contacts.People.CONTENT_URI, c.getInt(0)); mCr.delete(uri, null, null); } c.close(); } } @Override protected void tearDown() throws Exception { // stop our dummy thread? mEngineTester.stopEventThread(); mEngineTester = null; mEng = null; SQLiteDatabase db = mDb.getReadableDatabase(); if (db.inTransaction()) { db.endTransaction(); } db.close(); super.tearDown(); } private void runProcessor() { mEng.mProcessorCompleteFlag = false; mProcessor.start(); ServiceStatus status = mEng.waitForProcessorComplete(MAX_PROCESSOR_TIME); assertEquals(ServiceStatus.SUCCESS, status); } private void startSubTest(String function, String description) { Log.i(LOG_TAG, function + " - step " + mTestStep + ": " + description); mTestStep++; } @Override public void reportBackToEngine(int reqId, EngineId engine) { Log.d("TAG", "FetchNativeContactsTest.reportBackToEngine"); } @Override public void onEngineException(Exception exp) { // TODO Auto-generated method stub } private Integer fetchSyncNativeId(Long localDetailID) { Integer value = null; SQLiteDatabase readableDb = mDb.getReadableDatabase(); try { Cursor c = readableDb.rawQuery("SELECT " + ContactDetailsTable.Field.NATIVESYNCCONTACTID + " FROM " + ContactDetailsTable.TABLE_NAME + " WHERE " + Field.DETAILLOCALID + "=" + localDetailID, null); if (c.moveToFirst()) { if (!c.isNull(0)) { value = c.getInt(0); } } c.close(); } catch (SQLException e) { } return value; } @SmallTest @Suppress // Breaks tests public void testRunWithNoContactChanges() { final String fnName = "testRunWithNoContactChanges"; Log.i(LOG_TAG, "***** EXECUTING " + fnName + " *****"); mTestStep = 1; startSubTest(fnName, "Checking people database is empty"); Cursor peopleCursor = mDb.openContactSummaryCursor(null, null); assertEquals(0, peopleCursor.getCount()); startSubTest(fnName, "Checking native database is empty"); Cursor nativeCursor = mCr.query(People.CONTENT_URI, new String[] { People._ID }, null, null, null); assertEquals(nativeCursor.getCount(), 0); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking native database is still empty"); nativeCursor.requery(); assertEquals(nativeCursor.getCount(), 0); nativeCursor.close(); peopleCursor.close(); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, fnName + " has completed successfully"); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, ""); } @MediumTest @Suppress // Breaks tests public void testRunWithOneNewContact() { final String fnName = "testRunWithOneNewContact"; Log.i(LOG_TAG, "***** EXECUTING " + fnName + " *****"); mTestStep = 1; startSubTest(fnName, "Checking people database is empty"); Cursor peopleCursor = mDb.openContactSummaryCursor(null, null); assertEquals(0, peopleCursor.getCount()); assertTrue(Settings.ENABLE_UPDATE_NATIVE_CONTACTS); startSubTest(fnName, "Checking native database is empty"); Cursor nativeCursor = mCr.query(People.CONTENT_URI, new String[] { People._ID, People.NAME, People.NOTES }, null, null, null); assertEquals(0, nativeCursor.getCount()); startSubTest(fnName, "Add one dummy native contact"); ContentValues peopleValues = new ContentValues(); peopleValues.put(Contacts.People.NAME, ADD_CONTACT_TEST_NAME); peopleValues.put(Contacts.People.NOTES, ADD_CONTACT_TEST_NOTE); Uri personUri1 = mCr.insert(Contacts.People.CONTENT_URI, peopleValues); assertTrue("Unable to insert contact into native people table", personUri1 != null); final long personId = ContentUris.parseId(personUri1); ContentValues phoneValues = new ContentValues(); phoneValues.put(Contacts.Phones.PERSON_ID, personId); phoneValues.put(Contacts.Phones.NUMBER, ADD_PHONE_TEST1); phoneValues.put(Contacts.Phones.TYPE, ADD_PHONE_TYPE_TEST1); Uri phoneUri1 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 1", phoneUri1 != null); final long phoneId1 = (int)ContentUris.parseId(phoneUri1); phoneValues.put(Contacts.Phones.NUMBER, ADD_PHONE_TEST2); phoneValues.put(Contacts.Phones.TYPE, ADD_PHONE_TYPE_TEST2); phoneValues.put(Contacts.Phones.ISPRIMARY, 1); Uri phoneUri2 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 2", phoneUri2 != null); final long phoneId2 = ContentUris.parseId(phoneUri2); phoneValues.put(Contacts.Phones.NUMBER, ADD_PHONE_TEST3); phoneValues.put(Contacts.Phones.TYPE, ADD_PHONE_TYPE_TEST3); phoneValues.remove(Contacts.Phones.ISPRIMARY); Uri phoneUri3 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 3", phoneUri3 != null); final long phoneId3 = ContentUris.parseId(phoneUri3); ContentValues cmValues = new ContentValues(); cmValues.put(Contacts.ContactMethods.PERSON_ID, personId); cmValues.put(Contacts.ContactMethods.DATA, ADD_CM_TEST1); cmValues.put(Contacts.ContactMethods.TYPE, ADD_CM_TYPE_TEST1); cmValues.put(Contacts.ContactMethods.KIND, ADD_CM_KIND_TEST1); Uri cmUri1 = mCr.insert(Contacts.ContactMethods.CONTENT_URI, cmValues); assertTrue("Unable to insert contact into native contact methods table 1", cmUri1 != null); final long cmId1 = ContentUris.parseId(cmUri1); cmValues.put(Contacts.ContactMethods.DATA, ADD_CM_TEST2); cmValues.put(Contacts.ContactMethods.TYPE, ADD_CM_TYPE_TEST2); cmValues.put(Contacts.ContactMethods.KIND, ADD_CM_KIND_TEST2); cmValues.put(Contacts.ContactMethods.ISPRIMARY, 1); Uri cmUri2 = mCr.insert(Contacts.ContactMethods.CONTENT_URI, cmValues); assertTrue("Unable to insert contact into native contact methods table 2", cmUri2 != null); final long cmId2 = ContentUris.parseId(cmUri2); ContentValues orgValues = new ContentValues(); orgValues.put(Contacts.Organizations.PERSON_ID, personId); orgValues.put(Contacts.Organizations.COMPANY, ADD_ORG_COMPANY_TEST1); orgValues.put(Contacts.Organizations.TITLE, ADD_ORG_TITLE_TEST1); orgValues.put(Contacts.Organizations.TYPE, ADD_ORG_TYPE_TEST1); orgValues.put(Contacts.Organizations.LABEL, ADD_ORG_LABEL_TEST1); Uri orgUri = mCr.insert(Contacts.Organizations.CONTENT_URI, orgValues); assertTrue("Unable to insert contact into native organizations table 1", orgUri != null); final long orgId1 = ContentUris.parseId(orgUri); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking contact has been synced to people"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); assertTrue(peopleCursor.moveToFirst()); ContactSummary summary = ContactSummaryTable.getQueryData(peopleCursor); assertTrue(summary != null); Contact newContact = new Contact(); ServiceStatus status = mDb.fetchContact(summary.localContactID, newContact); assertEquals(ServiceStatus.SUCCESS, status); boolean doneName = false; boolean doneNickname = false; boolean doneNote = false; boolean donePhone1 = false; boolean donePhone2 = false; boolean donePhone3 = false; boolean doneCm1 = false; boolean doneCm2 = false; boolean doneOrg1 = false; boolean doneTitle1 = false; assertTrue(newContact.synctophone); assertEquals(personId, newContact.nativeContactId.longValue()); assertEquals(personId, summary.nativeContactId.longValue()); for (ContactDetail detail : newContact.details) { assertEquals(personId, detail.nativeContactId.longValue()); detail.syncNativeContactId = fetchSyncNativeId(detail.localDetailID); assertEquals("No sync marker, ID = " + detail.nativeDetailId + ", key = " + detail.key, Integer.valueOf(-1), detail.syncNativeContactId); Integer detailId = detail.nativeDetailId; assertTrue(detailId != null); switch (detail.key) { case VCARD_NAME: assertEquals(personId, detailId.longValue()); assertEquals(ADD_CONTACT_TEST_NAME, detail.nativeVal1); VCardHelper.Name name = detail.getName(); assertTrue(name != null); assertEquals(ADD_CONTACT_TEST_NAME, name.toString()); doneName = true; break; case VCARD_NICKNAME: assertEquals(personId, detailId.longValue()); assertEquals(ADD_CONTACT_TEST_NAME, detail.nativeVal1); assertEquals(ADD_CONTACT_TEST_NAME, detail.getValue()); doneNickname = true; break; case VCARD_NOTE: assertEquals(personId, detailId.longValue()); assertEquals(ADD_CONTACT_TEST_NOTE, detail.nativeVal1); assertEquals(ADD_CONTACT_TEST_NOTE, detail.getValue()); doneNote = true; break; case VCARD_PHONE: if (detailId.longValue() == phoneId1) { donePhone1 = true; assertEquals(ADD_PHONE_TEST1, detail.nativeVal1); assertEquals(ADD_PHONE_TEST1, detail.getValue()); assertEquals(ADD_PHONE_PEOPLE_TYPE_TEST1, detail.keyType); assertEquals(Integer.valueOf(ContactDetail.ORDER_NORMAL), detail.order); } else if (detailId.longValue() == phoneId2) { donePhone2 = true; assertEquals(ADD_PHONE_TEST2, detail.nativeVal1); assertEquals(ADD_PHONE_TEST2, detail.getValue()); assertEquals(ADD_PHONE_PEOPLE_TYPE_TEST2, detail.keyType); assertEquals(Integer.valueOf(ContactDetail.ORDER_PREFERRED), detail.order); } else if (detailId.longValue() == phoneId3) { donePhone3 = true; assertEquals(ADD_PHONE_TEST3, detail.nativeVal1); assertEquals(ADD_PHONE_TEST3, detail.getValue()); assertEquals(ADD_PHONE_PEOPLE_TYPE_TEST3, detail.keyType); assertEquals(Integer.valueOf(ContactDetail.ORDER_NORMAL), detail.order); } else { fail("Unknown phone number in people contact: ID:" + detailId + " does not match " + phoneId1 + "," + phoneId2 + "," + phoneId3); } break; case VCARD_EMAIL: assertTrue(detailId != null); if (detailId.longValue() == cmId1) { doneCm1 = true; assertEquals(ADD_CM_TEST1, detail.nativeVal1); assertEquals(String.valueOf(ADD_CM_TYPE_TEST1), detail.nativeVal2); assertEquals(String.valueOf(ADD_CM_KIND_TEST1), detail.nativeVal3); assertEquals(ADD_CM_TEST1, detail.getValue()); assertEquals(ADD_CM_PEOPLE_TYPE_TEST1, detail.keyType); } else { fail("Unknown email in people contact"); } break; case VCARD_ADDRESS: assertTrue(detailId != null); if (detailId.longValue() == cmId2) { doneCm2 = true; assertEquals(ADD_CM_TEST2, detail.nativeVal1); assertEquals(String.valueOf(ADD_CM_TYPE_TEST2), detail.nativeVal2); assertEquals(String.valueOf(ADD_CM_KIND_TEST2), detail.nativeVal3); VCardHelper.PostalAddress address = detail.getPostalAddress(); assertTrue(address != null); assertEquals(ADD_CM_TEST2_ADDRESS1, address.addressLine1); assertEquals(ADD_CM_TEST2_ADDRESS2, address.addressLine2); assertEquals(ADD_CM_TEST2_ADDRESS_CITY, address.city); assertEquals(ADD_CM_TEST2_ADDRESS_COUNTY, address.county); assertEquals(ADD_CM_TEST2_ADDRESS_POSTCODE, address.postCode); assertEquals(ADD_CM_TEST2_ADDRESS_COUNTRY, address.country); assertEquals(ADD_CM_PEOPLE_TYPE_TEST2, detail.keyType); } else { fail("Unknown address in people contact"); } break; case VCARD_ORG: assertTrue(detailId != null); if (detailId.longValue() == orgId1) { doneOrg1 = true; assertEquals(ADD_ORG_COMPANY_TEST1, detail.nativeVal1); assertEquals(String.valueOf(ADD_ORG_TYPE_TEST1), detail.nativeVal3); VCardHelper.Organisation org = detail.getOrg(); assertTrue(org != null); assertEquals(0, org.unitNames.size()); assertEquals(ADD_ORG_COMPANY_TEST1, org.name); assertEquals(ADD_ORG_PEOPLE_TYPE_TEST1, detail.keyType); } else { fail("Unknown organisation in people contact"); } break; case VCARD_TITLE: assertTrue(detailId != null); if (detailId.longValue() == orgId1) { doneTitle1 = true; assertEquals(ADD_ORG_TITLE_TEST1, detail.nativeVal1); assertEquals(ADD_ORG_TITLE_TEST1, detail.getValue()); } else { fail("Unknown title in people contact"); } break; default: fail("Unexpected detail in people contact: " + detail.key); } } assertTrue("Name was missing", doneName); assertTrue("Nickname was missing", doneNickname); assertTrue("Note was missing", doneNote); assertTrue("Phone1 was missing", donePhone1); assertTrue("Phone2 was missing", donePhone2); assertTrue("Phone3 was missing", donePhone3); assertTrue("Email was missing", doneCm1); assertTrue("Address was missing", doneCm2); assertTrue("Organisation was missing", doneOrg1); assertTrue("Title was missing", doneTitle1); nativeCursor.close(); peopleCursor.close(); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, fnName + " has completed successfully"); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, ""); } @MediumTest @Suppress // Breaks tests public void testRunWithOneNoNameContact() { final String fnName = "testRunWithOneNoNameContact"; Log.i(LOG_TAG, "***** EXECUTING " + fnName + " *****"); mTestStep = 1; startSubTest(fnName, "Checking people database is empty"); Cursor peopleCursor = mDb.openContactSummaryCursor(null, null); assertEquals(0, peopleCursor.getCount()); assertTrue(Settings.ENABLE_UPDATE_NATIVE_CONTACTS); startSubTest(fnName, "Checking native database is empty"); Cursor nativeCursor = mCr.query(People.CONTENT_URI, new String[] { People._ID, People.NAME, People.NOTES }, null, null, null); assertEquals(0, nativeCursor.getCount()); startSubTest(fnName, "Add one dummy native contact"); ContentValues peopleValues = new ContentValues(); Uri personUri1 = mCr.insert(Contacts.People.CONTENT_URI, peopleValues); assertTrue("Unable to insert contact into native people table", personUri1 != null); final long personId = ContentUris.parseId(personUri1); ContentValues phoneValues = new ContentValues(); phoneValues.put(Contacts.Phones.PERSON_ID, personId); phoneValues.put(Contacts.Phones.NUMBER, ADD_PHONE_TEST1); phoneValues.put(Contacts.Phones.TYPE, ADD_PHONE_TYPE_TEST1); phoneValues.put(Contacts.Phones.ISPRIMARY, 1); Uri phoneUri1 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 1", phoneUri1 != null); final long phoneId = (int)ContentUris.parseId(phoneUri1); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking contact has been synced to people"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); assertTrue(peopleCursor.moveToFirst()); ContactSummary summary = ContactSummaryTable.getQueryData(peopleCursor); assertTrue(summary != null); Contact newContact = new Contact(); ServiceStatus status = mDb.fetchContact(summary.localContactID, newContact); assertEquals(ServiceStatus.SUCCESS, status); assertTrue(newContact.synctophone); assertEquals(personId, newContact.nativeContactId.longValue()); assertEquals(personId, summary.nativeContactId.longValue()); boolean donePhone = false; for (ContactDetail detail : newContact.details) { assertEquals(personId, detail.nativeContactId.longValue()); detail.syncNativeContactId = fetchSyncNativeId(detail.localDetailID); assertEquals("No sync marker, ID = " + detail.nativeDetailId + ", key = " + detail.key, Integer.valueOf(-1), detail.syncNativeContactId); Integer detailId = detail.nativeDetailId; switch (detail.key) { case VCARD_PHONE: assertTrue(detailId != null); assertTrue(detail.nativeDetailId != null); assertEquals(phoneId, detail.nativeDetailId.longValue()); assertFalse(donePhone); donePhone = true; assertEquals(ADD_PHONE_TEST1, detail.nativeVal1); assertEquals(ADD_PHONE_TEST1, detail.getValue()); assertEquals(Integer.valueOf(ContactDetail.ORDER_PREFERRED), detail.order); break; default: fail("Unexpected detail in people contact: " + detail.key); } } assertTrue("Phone number was missing", donePhone); nativeCursor.close(); peopleCursor.close(); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, fnName + " has completed successfully"); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, ""); } @MediumTest @Suppress // Breaks tests. public void testRunWithOneModifiedContact() { final String fnName = "testRunWithOneModifiedContact"; Log.i(LOG_TAG, "***** EXECUTING " + fnName + " *****"); mTestStep = 1; startSubTest(fnName, "Checking people database is empty"); Cursor peopleCursor = mDb.openContactSummaryCursor(null, null); assertEquals(0, peopleCursor.getCount()); assertTrue(Settings.ENABLE_UPDATE_NATIVE_CONTACTS); startSubTest(fnName, "Checking native database is empty"); Cursor nativeCursor = mCr.query(People.CONTENT_URI, new String[] { People._ID, People.NAME, People.NOTES }, null, null, null); assertEquals(0, nativeCursor.getCount()); startSubTest(fnName, "Add one dummy native contact"); ContentValues peopleValues = new ContentValues(); peopleValues.put(Contacts.People.NAME, ADD_CONTACT_TEST_NAME); peopleValues.put(Contacts.People.NOTES, ADD_CONTACT_TEST_NOTE); Uri personUri1 = mCr.insert(Contacts.People.CONTENT_URI, peopleValues); assertTrue("Unable to insert contact into native people table", personUri1 != null); final long personId = ContentUris.parseId(personUri1); ContentValues phoneValues = new ContentValues(); phoneValues.put(Contacts.Phones.PERSON_ID, personId); phoneValues.put(Contacts.Phones.NUMBER, ADD_PHONE_TEST1); phoneValues.put(Contacts.Phones.TYPE, ADD_PHONE_TYPE_TEST1); Uri phoneUri1 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 1", phoneUri1 != null); final long phoneId1 = (int)ContentUris.parseId(phoneUri1); ContentValues cmValues = new ContentValues(); cmValues.put(Contacts.ContactMethods.PERSON_ID, personId); cmValues.put(Contacts.ContactMethods.DATA, ADD_CM_TEST1); cmValues.put(Contacts.ContactMethods.TYPE, ADD_CM_TYPE_TEST1); cmValues.put(Contacts.ContactMethods.KIND, ADD_CM_KIND_TEST1); cmValues.put(Contacts.ContactMethods.ISPRIMARY, 1); Uri cmUri1 = mCr.insert(Contacts.ContactMethods.CONTENT_URI, cmValues); assertTrue("Unable to insert contact into native contact methods table 1", cmUri1 != null); final long cmId1 = ContentUris.parseId(cmUri1); ContentValues orgValues = new ContentValues(); orgValues.put(Contacts.Organizations.PERSON_ID, personId); orgValues.put(Contacts.Organizations.COMPANY, ADD_ORG_COMPANY_TEST1); orgValues.put(Contacts.Organizations.TITLE, ADD_ORG_TITLE_TEST1); orgValues.put(Contacts.Organizations.TYPE, ADD_ORG_TYPE_TEST1); orgValues.put(Contacts.Organizations.LABEL, ADD_ORG_LABEL_TEST1); Uri orgUri = mCr.insert(Contacts.Organizations.CONTENT_URI, orgValues); assertTrue("Unable to insert contact into native organizations table 1", orgUri != null); final long orgId1 = ContentUris.parseId(orgUri); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking contact has been synced to people"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); startSubTest(fnName, "Modifying name"); peopleValues.clear(); peopleValues.put(Contacts.People.NAME, MODIFY_CONTACT_TEST_NAME); int rowsUpdated = mCr.update(personUri1, peopleValues, null, null); assertEquals(1, rowsUpdated); startSubTest(fnName, "Modifying phone number"); phoneValues.clear(); phoneValues.put(Contacts.Phones.NUMBER, MODIFY_PHONE_TEST1); rowsUpdated = mCr.update(phoneUri1, phoneValues, null, null); assertEquals(1, rowsUpdated); startSubTest(fnName, "Modifying email address"); cmValues.clear(); cmValues.put(Contacts.ContactMethods.DATA, MODIFY_EMAIL_TEST1); rowsUpdated = mCr.update(cmUri1, cmValues, null, null); assertEquals(1, rowsUpdated); startSubTest(fnName, "Modifying organization"); orgValues.clear(); orgValues.put(Contacts.Organizations.COMPANY, MODIFY_COMPANY_TEST1); rowsUpdated = mCr.update(orgUri, orgValues, null, null); assertEquals(1, rowsUpdated); startSubTest(fnName, "Adding phone number"); phoneValues.clear(); phoneValues.put(Contacts.Phones.PERSON_ID, personId); phoneValues.put(Contacts.Phones.NUMBER, MODIFY_PHONE_TEST2); phoneValues.put(Contacts.Phones.TYPE, MODIFY_PHONE_TYPE_TEST2); phoneValues.put(Contacts.Phones.ISPRIMARY, 1); Uri phoneUri2 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 2", phoneUri2 != null); final long phoneId2 = (int)ContentUris.parseId(phoneUri2); startSubTest(fnName, "Adding email address"); cmValues.clear(); cmValues.put(Contacts.ContactMethods.PERSON_ID, personId); cmValues.put(Contacts.ContactMethods.DATA, MODIFY_EMAIL_TEST2); cmValues.put(Contacts.ContactMethods.TYPE, MODIFY_EMAIL_TYPE_TEST2); cmValues.put(Contacts.ContactMethods.KIND, MODIFY_EMAIL_KIND_TEST2); Uri cmUri2 = mCr.insert(Contacts.ContactMethods.CONTENT_URI, cmValues); assertTrue("Unable to insert contact into native contact methods table 1", cmUri2 != null); final long cmId2 = (int)ContentUris.parseId(cmUri2); startSubTest(fnName, "Adding organization"); orgValues.clear(); orgValues.put(Contacts.Organizations.PERSON_ID, personId); orgValues.put(Contacts.Organizations.COMPANY, MODIFY_COMPANY_TEST2); orgValues.put(Contacts.Organizations.TITLE, MODIFY_TITLE_TEST2); orgValues.put(Contacts.Organizations.TYPE, MODIFY_COMPANY_TYPE_TEST2); orgValues.put(Contacts.Organizations.ISPRIMARY, 1); Uri orgUri2 = mCr.insert(Contacts.Organizations.CONTENT_URI, orgValues); assertTrue("Unable to insert contact into native contact methods table 1", orgUri2 != null); final long orgId2 = (int)ContentUris.parseId(orgUri2); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking still 1 contact"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); assertTrue(peopleCursor.moveToFirst()); ContactSummary summary = ContactSummaryTable.getQueryData(peopleCursor); assertTrue(summary != null); Contact newContact = new Contact(); ServiceStatus status = mDb.fetchContact(summary.localContactID, newContact); assertEquals(ServiceStatus.SUCCESS, status); boolean doneName = false; boolean doneNickname = false; boolean doneNote = false; boolean donePhone1 = false; boolean donePhone2 = false; boolean doneCm1 = false; boolean doneCm2 = false; boolean doneOrg1 = false; boolean doneOrg2 = false; boolean doneTitle1 = false; boolean doneTitle2 = false; assertTrue(newContact.synctophone); assertEquals(personId, newContact.nativeContactId.longValue()); assertEquals(personId, summary.nativeContactId.longValue()); for (ContactDetail detail : newContact.details) { assertEquals(Integer.valueOf((int)personId), detail.nativeContactId); detail.syncNativeContactId = fetchSyncNativeId(detail.localDetailID); assertEquals("No sync marker, ID = " + detail.nativeDetailId + ", key = " + detail.key, Integer.valueOf(-1), detail.syncNativeContactId); Integer detailId = detail.nativeDetailId; assertTrue(detailId != null); switch (detail.key) { case VCARD_NAME: assertEquals(personId, detailId.longValue()); assertEquals(MODIFY_CONTACT_TEST_NAME, detail.nativeVal1); VCardHelper.Name name = detail.getName(); assertTrue(name != null); assertEquals(MODIFY_CONTACT_TEST_NAME, name.toString()); doneName = true; break; case VCARD_NICKNAME: assertEquals(personId, detailId.longValue()); assertEquals(MODIFY_CONTACT_TEST_NAME, detail.nativeVal1); assertEquals(MODIFY_CONTACT_TEST_NAME, detail.getValue()); doneNickname = true; break; case VCARD_NOTE: assertEquals(personId, detailId.longValue()); assertEquals(ADD_CONTACT_TEST_NOTE, detail.nativeVal1); assertEquals(ADD_CONTACT_TEST_NOTE, detail.getValue()); doneNote = true; break; case VCARD_PHONE: if (detailId.longValue() == phoneId1) { donePhone1 = true; assertEquals(MODIFY_PHONE_TEST1, detail.nativeVal1); assertEquals(MODIFY_PHONE_TEST1, detail.getValue()); assertEquals(ADD_PHONE_PEOPLE_TYPE_TEST1, detail.keyType); assertEquals(Integer.valueOf(ContactDetail.ORDER_NORMAL), detail.order); } else if (detailId.longValue() == phoneId2) { donePhone2 = true; assertEquals(MODIFY_PHONE_TEST2, detail.nativeVal1); assertEquals(MODIFY_PHONE_TEST2, detail.getValue()); assertEquals(MODIFY_PHONE_PEOPLE_TYPE_TEST2, detail.keyType); assertEquals(Integer.valueOf(ContactDetail.ORDER_PREFERRED), detail.order); } else { fail("Unknown phone number in people contact: ID:" + detailId + " does not match " + phoneId1 + "," + phoneId2); } break; case VCARD_EMAIL: assertTrue(detailId != null); if (detailId.longValue() == cmId1) { doneCm1 = true; assertEquals(MODIFY_EMAIL_TEST1, detail.nativeVal1); assertEquals(MODIFY_EMAIL_TEST1, detail.getValue()); assertEquals(String.valueOf(ADD_CM_TYPE_TEST1), detail.nativeVal2); assertEquals(String.valueOf(ADD_CM_KIND_TEST1), detail.nativeVal3); assertEquals(ADD_CM_PEOPLE_TYPE_TEST1, detail.keyType); assertEquals(Integer.valueOf(ContactDetail.ORDER_PREFERRED), detail.order); } else if (detailId.longValue() == cmId2) { doneCm2 = true; assertEquals(MODIFY_EMAIL_TEST2, detail.nativeVal1); assertEquals(MODIFY_EMAIL_TEST2, detail.getValue()); assertEquals(String.valueOf(MODIFY_EMAIL_KIND_TEST2), detail.nativeVal2); assertEquals(String.valueOf(MODIFY_EMAIL_TYPE_TEST2), detail.nativeVal3); assertEquals(MODIFY_EMAIL_PEOPLE_TYPE_TEST2, detail.keyType); assertEquals(Integer.valueOf(ContactDetail.ORDER_NORMAL), detail.order); } else { fail("Unknown email in people contact: ID:" + detailId + " does not match " + phoneId1 + "," + phoneId2); } break; case VCARD_ORG: assertTrue(detailId != null); if (detailId.longValue() == orgId1) { doneOrg1 = true; assertEquals(MODIFY_COMPANY_TEST1, detail.nativeVal1); assertEquals(String.valueOf(ADD_ORG_TYPE_TEST1), detail.nativeVal3); VCardHelper.Organisation org = detail.getOrg(); assertTrue(org != null); assertEquals(0, org.unitNames.size()); assertEquals(MODIFY_COMPANY_TEST1, org.name); assertEquals(ADD_ORG_PEOPLE_TYPE_TEST1, detail.keyType); assertEquals(Integer.valueOf(ContactDetail.ORDER_NORMAL), detail.order); } else if (detailId.longValue() == orgId2) { doneOrg2 = true; assertEquals(MODIFY_COMPANY_TEST2, detail.nativeVal1); assertEquals(String.valueOf(MODIFY_COMPANY_TYPE_TEST2), detail.nativeVal3); VCardHelper.Organisation org = detail.getOrg(); assertTrue(org != null); assertEquals(0, org.unitNames.size()); assertEquals(MODIFY_COMPANY_TEST2, org.name); assertEquals(MODIFY_COMPANY_PEOPLE_TYPE_TEST2, detail.keyType); assertEquals(Integer.valueOf(ContactDetail.ORDER_PREFERRED), detail.order); } else { fail("Unknown organisation in people contact"); } break; case VCARD_TITLE: assertTrue(detailId != null); if (detailId.longValue() == orgId1) { doneTitle1 = true; assertEquals(ADD_ORG_TITLE_TEST1, detail.nativeVal1); assertEquals(ADD_ORG_TITLE_TEST1, detail.getValue()); } else if (detailId.longValue() == orgId2) { doneTitle2 = true; assertEquals(MODIFY_TITLE_TEST2, detail.nativeVal1); assertEquals(MODIFY_TITLE_TEST2, detail.getValue()); } else { fail("Unknown title in people contact"); } break; default: fail("Unexpected detail in people contact: " + detail.key); } } assertTrue("Name was missing", doneName); assertTrue("Nickname was missing", doneNickname); assertTrue("Note was missing", doneNote); assertTrue("Phone1 was missing", donePhone1); assertTrue("Phone2 was missing", donePhone2); assertTrue("Email1 was missing", doneCm1); assertTrue("Email2 was missing", doneCm2); assertTrue("Organisation1 was missing", doneOrg1); assertTrue("Organisation2 was missing", doneOrg2); assertTrue("Title1 was missing", doneTitle1); assertTrue("Title2 was missing", doneTitle2); nativeCursor.close(); peopleCursor.close(); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, fnName + " has completed successfully"); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, ""); } @MediumTest @Suppress // Breaks tests public void testRunWithDeletedDetails() { final String fnName = "testRunWithDeletedDetails"; Log.i(LOG_TAG, "***** EXECUTING " + fnName + " *****"); mTestStep = 1; startSubTest(fnName, "Checking people database is empty"); Cursor peopleCursor = mDb.openContactSummaryCursor(null, null); assertEquals(0, peopleCursor.getCount()); assertTrue(Settings.ENABLE_UPDATE_NATIVE_CONTACTS); startSubTest(fnName, "Checking native database is empty"); Cursor nativeCursor = mCr.query(People.CONTENT_URI, new String[] { People._ID, People.NAME, People.NOTES }, null, null, null); assertEquals(0, nativeCursor.getCount()); startSubTest(fnName, "Add one dummy native contact"); ContentValues peopleValues = new ContentValues(); peopleValues.put(Contacts.People.NAME, ADD_CONTACT_TEST_NAME); peopleValues.put(Contacts.People.NOTES, ADD_CONTACT_TEST_NOTE); Uri personUri1 = mCr.insert(Contacts.People.CONTENT_URI, peopleValues); assertTrue("Unable to insert contact into native people table", personUri1 != null); final long personId = ContentUris.parseId(personUri1); ContentValues phoneValues = new ContentValues(); phoneValues.put(Contacts.Phones.PERSON_ID, personId); phoneValues.put(Contacts.Phones.NUMBER, ADD_PHONE_TEST1); phoneValues.put(Contacts.Phones.TYPE, ADD_PHONE_TYPE_TEST1); Uri phoneUri1 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 1", phoneUri1 != null); final long phoneId1 = (int)ContentUris.parseId(phoneUri1); ContentValues cmValues = new ContentValues(); cmValues.put(Contacts.ContactMethods.PERSON_ID, personId); cmValues.put(Contacts.ContactMethods.DATA, ADD_CM_TEST1); cmValues.put(Contacts.ContactMethods.TYPE, ADD_CM_TYPE_TEST1); cmValues.put(Contacts.ContactMethods.KIND, ADD_CM_KIND_TEST1); Uri cmUri1 = mCr.insert(Contacts.ContactMethods.CONTENT_URI, cmValues); assertTrue("Unable to insert contact into native contact methods table 1", cmUri1 != null); final long cmId1 = ContentUris.parseId(cmUri1); cmValues.put(Contacts.ContactMethods.DATA, ADD_CM_TEST2); cmValues.put(Contacts.ContactMethods.TYPE, ADD_CM_TYPE_TEST2); cmValues.put(Contacts.ContactMethods.KIND, ADD_CM_KIND_TEST2); cmValues.put(Contacts.ContactMethods.ISPRIMARY, 1); Uri cmUri2 = mCr.insert(Contacts.ContactMethods.CONTENT_URI, cmValues); assertTrue("Unable to insert contact into native contact methods table 2", cmUri2 != null); final long cmId2 = ContentUris.parseId(cmUri2); ContentValues orgValues = new ContentValues(); orgValues.put(Contacts.Organizations.PERSON_ID, personId); orgValues.put(Contacts.Organizations.COMPANY, ADD_ORG_COMPANY_TEST1); orgValues.put(Contacts.Organizations.TITLE, ADD_ORG_TITLE_TEST1); orgValues.put(Contacts.Organizations.TYPE, ADD_ORG_TYPE_TEST1); orgValues.put(Contacts.Organizations.LABEL, ADD_ORG_LABEL_TEST1); Uri orgUri = mCr.insert(Contacts.Organizations.CONTENT_URI, orgValues); assertTrue("Unable to insert contact into native organizations table 1", orgUri != null); final long orgId1 = ContentUris.parseId(orgUri); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking contact has been synced to people"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); assertTrue(peopleCursor.moveToFirst()); ContactSummary summary = ContactSummaryTable.getQueryData(peopleCursor); assertTrue(summary != null); Contact newContact = new Contact(); ServiceStatus status = mDb.fetchContact(summary.localContactID, newContact); assertEquals(ServiceStatus.SUCCESS, status); boolean doneNote = false; boolean donePhone1 = false; boolean doneCm1 = false; boolean doneCm2 = false; boolean doneOrg1 = false; boolean doneTitle1 = false; assertTrue(newContact.synctophone); assertEquals(personId, newContact.nativeContactId.longValue()); assertEquals(personId, summary.nativeContactId.longValue()); for (ContactDetail detail : newContact.details) { assertEquals(personId, detail.nativeContactId.longValue()); detail.syncNativeContactId = fetchSyncNativeId(detail.localDetailID); assertEquals("No sync marker, ID = " + detail.nativeDetailId + ", key = " + detail.key, Integer.valueOf(-1), detail.syncNativeContactId); Integer detailId = detail.nativeDetailId; assertTrue(detailId != null); switch (detail.key) { case VCARD_NAME: case VCARD_NICKNAME: assertEquals(personId, detailId.longValue()); break; case VCARD_NOTE: assertEquals(personId, detailId.longValue()); doneNote = true; mDb.deleteContactDetail(detail.localDetailID); break; case VCARD_PHONE: if (detailId.longValue() == phoneId1) { donePhone1 = true; mDb.deleteContactDetail(detail.localDetailID); } else { fail("Unknown phone number in people contact: ID:" + detailId + " does not match " + phoneId1); } break; case VCARD_EMAIL: if (detailId.longValue() == cmId1) { doneCm1 = true; mDb.deleteContactDetail(detail.localDetailID); } else { fail("Unknown email in people contact"); } break; case VCARD_ADDRESS: if (detailId.longValue() == cmId2) { doneCm2 = true; mDb.deleteContactDetail(detail.localDetailID); } else { fail("Unknown address in people contact"); } break; case VCARD_ORG: if (detailId.longValue() == orgId1) { doneOrg1 = true; mDb.deleteContactDetail(detail.localDetailID); } else { fail("Unknown organisation in people contact"); } break; case VCARD_TITLE: if (detailId.longValue() == orgId1) { doneTitle1 = true; mDb.deleteContactDetail(detail.localDetailID); } else { fail("Unknown title in people contact"); } break; default: fail("Unexpected detail in people contact: " + detail.key); } } assertTrue("Note was missing", doneNote); assertTrue("Phone1 was missing", donePhone1); assertTrue("Email was missing", doneCm1); assertTrue("Address was missing", doneCm2); assertTrue("Organisation was missing", doneOrg1); assertTrue("Position was missing", doneTitle1); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking contact has been synced to people"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); assertTrue(peopleCursor.moveToFirst()); summary = ContactSummaryTable.getQueryData(peopleCursor); assertTrue(summary != null); newContact = new Contact(); status = mDb.fetchContact(summary.localContactID, newContact); assertEquals(ServiceStatus.SUCCESS, status); assertTrue(newContact.synctophone); assertEquals(personId, newContact.nativeContactId.longValue()); assertEquals(personId, summary.nativeContactId.longValue()); boolean doneName = false; boolean doneNickname = false; for (ContactDetail detail : newContact.details) { assertEquals(personId, detail.nativeContactId.longValue()); detail.syncNativeContactId = fetchSyncNativeId(detail.localDetailID); assertEquals("No sync marker, ID = " + detail.nativeDetailId + ", key = " + detail.key, Integer.valueOf(-1), detail.syncNativeContactId); Integer detailId = detail.nativeDetailId; assertTrue(detailId != null); switch (detail.key) { case VCARD_NAME: assertEquals(personId, detailId.longValue()); assertEquals(ADD_CONTACT_TEST_NAME, detail.nativeVal1); VCardHelper.Name name = detail.getName(); assertTrue(name != null); assertEquals(ADD_CONTACT_TEST_NAME, name.toString()); doneName = true; break; case VCARD_NICKNAME: assertEquals(personId, detailId.longValue()); assertEquals(ADD_CONTACT_TEST_NAME, detail.nativeVal1); assertEquals(ADD_CONTACT_TEST_NAME, detail.getValue()); doneNickname = true; break; default: fail("Unexpected contact detail: " + detail.key); } } assertTrue("Name was missing", doneName); assertTrue("Nickname was missing", doneNickname); nativeCursor.close(); peopleCursor.close(); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, fnName + " has completed successfully"); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, ""); } @MediumTest @Suppress // Breaks tests public void testRunWithDeletedContact() { final String fnName = "testRunWithDeletedContact"; Log.i(LOG_TAG, "***** EXECUTING " + fnName + " *****"); mTestStep = 1; startSubTest(fnName, "Checking people database is empty"); Cursor peopleCursor = mDb.openContactSummaryCursor(null, null); assertEquals(0, peopleCursor.getCount()); assertTrue(Settings.ENABLE_UPDATE_NATIVE_CONTACTS); startSubTest(fnName, "Checking native database is empty"); Cursor nativeCursor = mCr.query(People.CONTENT_URI, new String[] { People._ID, People.NAME, People.NOTES }, null, null, null); assertEquals(0, nativeCursor.getCount()); startSubTest(fnName, "Add one dummy native contact"); ContentValues peopleValues = new ContentValues(); peopleValues.put(Contacts.People.NAME, ADD_CONTACT_TEST_NAME); peopleValues.put(Contacts.People.NOTES, ADD_CONTACT_TEST_NOTE); Uri personUri1 = mCr.insert(Contacts.People.CONTENT_URI, peopleValues); assertTrue("Unable to insert contact into native people table", personUri1 != null); final long personId = ContentUris.parseId(personUri1); ContentValues phoneValues = new ContentValues(); phoneValues.put(Contacts.Phones.PERSON_ID, personId); phoneValues.put(Contacts.Phones.NUMBER, ADD_PHONE_TEST1); phoneValues.put(Contacts.Phones.TYPE, ADD_PHONE_TYPE_TEST1); Uri phoneUri1 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 1", phoneUri1 != null); ContentValues cmValues = new ContentValues(); cmValues.put(Contacts.ContactMethods.PERSON_ID, personId); cmValues.put(Contacts.ContactMethods.DATA, ADD_CM_TEST1); cmValues.put(Contacts.ContactMethods.TYPE, ADD_CM_TYPE_TEST1); cmValues.put(Contacts.ContactMethods.KIND, ADD_CM_KIND_TEST1); Uri cmUri1 = mCr.insert(Contacts.ContactMethods.CONTENT_URI, cmValues); assertTrue("Unable to insert contact into native contact methods table 1", cmUri1 != null); cmValues.put(Contacts.ContactMethods.DATA, ADD_CM_TEST2); cmValues.put(Contacts.ContactMethods.TYPE, ADD_CM_TYPE_TEST2); cmValues.put(Contacts.ContactMethods.KIND, ADD_CM_KIND_TEST2); cmValues.put(Contacts.ContactMethods.ISPRIMARY, 1); Uri cmUri2 = mCr.insert(Contacts.ContactMethods.CONTENT_URI, cmValues); assertTrue("Unable to insert contact into native contact methods table 2", cmUri2 != null); ContentValues orgValues = new ContentValues(); orgValues.put(Contacts.Organizations.PERSON_ID, personId); orgValues.put(Contacts.Organizations.COMPANY, ADD_ORG_COMPANY_TEST1); orgValues.put(Contacts.Organizations.TITLE, ADD_ORG_TITLE_TEST1); orgValues.put(Contacts.Organizations.TYPE, ADD_ORG_TYPE_TEST1); orgValues.put(Contacts.Organizations.LABEL, ADD_ORG_LABEL_TEST1); Uri orgUri = mCr.insert(Contacts.Organizations.CONTENT_URI, orgValues); assertTrue("Unable to insert contact into native organizations table 1", orgUri != null); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking contact has been synced to people"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); int rows = mCr.delete(personUri1, null, null); assertEquals(1, rows); startSubTest(fnName, "Running processor again"); runProcessor(); startSubTest(fnName, "Checking contact has been deleted"); peopleCursor.requery(); assertEquals(0, peopleCursor.getCount()); SQLiteDatabase sqlDb = mDb.getReadableDatabase(); Cursor contactsCountCursor = sqlDb.rawQuery("SELECT COUNT(*) FROM " + ContactsTable.TABLE_NAME, null); assertTrue(contactsCountCursor.moveToFirst()); assertEquals(0, contactsCountCursor.getInt(0)); contactsCountCursor.close(); Cursor detailCountCursor = sqlDb.rawQuery("SELECT COUNT(*) FROM " + ContactDetailsTable.TABLE_NAME, null); assertTrue(detailCountCursor.moveToFirst()); assertEquals(0, detailCountCursor.getInt(0)); detailCountCursor.close(); nativeCursor.close(); peopleCursor.close(); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, fnName + " has completed successfully"); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, ""); } @MediumTest @Suppress // Breaks tests. public void testRunConflictTests() { final String fnName = "testRunConflictTests"; Log.i(LOG_TAG, "***** EXECUTING " + fnName + " *****"); mTestStep = 1; startSubTest(fnName, "Checking people database is empty"); Cursor peopleCursor = mDb.openContactSummaryCursor(null, null); assertEquals(0, peopleCursor.getCount()); assertTrue(Settings.ENABLE_UPDATE_NATIVE_CONTACTS); startSubTest(fnName, "Checking native database is empty"); Cursor nativeCursor = mCr.query(People.CONTENT_URI, new String[] { People._ID, People.NAME, People.NOTES }, null, null, null); assertEquals(0, nativeCursor.getCount()); startSubTest(fnName, "Add one dummy native contact"); ContentValues peopleValues = new ContentValues(); peopleValues.put(Contacts.People.NAME, ADD_CONTACT_TEST_NAME); peopleValues.put(Contacts.People.NOTES, ADD_CONTACT_TEST_NOTE); Uri personUri1 = mCr.insert(Contacts.People.CONTENT_URI, peopleValues); assertTrue("Unable to insert contact into native people table", personUri1 != null); final long personId = ContentUris.parseId(personUri1); ContentValues phoneValues = new ContentValues(); phoneValues.put(Contacts.Phones.PERSON_ID, personId); phoneValues.put(Contacts.Phones.NUMBER, ADD_PHONE_TEST1); phoneValues.put(Contacts.Phones.TYPE, ADD_PHONE_TYPE_TEST1); Uri phoneUri1 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 1", phoneUri1 != null); final long phoneId1 = (int)ContentUris.parseId(phoneUri1); phoneValues.put(Contacts.Phones.NUMBER, ADD_PHONE_TEST2); phoneValues.put(Contacts.Phones.TYPE, ADD_PHONE_TYPE_TEST2); phoneValues.put(Contacts.Phones.ISPRIMARY, 1); Uri phoneUri2 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 2", phoneUri2 != null); final long phoneId2 = ContentUris.parseId(phoneUri2); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking contact has been synced to people"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); assertTrue(peopleCursor.moveToFirst()); ContactSummary summary = ContactSummaryTable.getQueryData(peopleCursor); assertTrue(summary != null); Contact orgContact = new Contact(); ServiceStatus status = mDb.fetchContact(summary.localContactID, orgContact); assertEquals(ServiceStatus.SUCCESS, status); startSubTest(fnName, "Modifying phone detail in people and native"); phoneValues.clear(); phoneValues.put(Contacts.Phones.NUMBER, MODIFY_PHONE_TEST1); int rowsUpdated = mCr.update(phoneUri1, phoneValues, null, null); assertEquals(1, rowsUpdated); boolean donePhone1 = false; for (ContactDetail detail : orgContact.details) { if (detail.key == ContactDetail.DetailKeys.VCARD_PHONE && detail.nativeDetailId.longValue() == phoneId1) { detail.setTel(MODIFY_PHONE_TEST2, MODIFY_PHONE_PEOPLE_TYPE_TEST2); status = mDb.modifyContactDetail(detail); assertEquals(ServiceStatus.SUCCESS, status); donePhone1 = true; break; } } assertTrue("Phone was not synced", donePhone1); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking contact has not been changed"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); assertTrue(peopleCursor.moveToFirst()); summary = ContactSummaryTable.getQueryData(peopleCursor); assertTrue(summary != null); Contact newContact = new Contact(); status = mDb.fetchContact(summary.localContactID, newContact); assertEquals(ServiceStatus.SUCCESS, status); donePhone1 = false; boolean donePhone2 = false; for (ContactDetail detail : newContact.details) { if (detail.key == ContactDetail.DetailKeys.VCARD_PHONE) { if (detail.nativeDetailId.longValue() == phoneId1) { assertEquals(MODIFY_PHONE_TEST2, detail.getTel()); assertEquals(MODIFY_PHONE_PEOPLE_TYPE_TEST2, detail.keyType); donePhone1 = true; } else { mDb.deleteContactDetail(detail.localDetailID); donePhone2 = true; } } } assertTrue("Phone detail 1 is now missing", donePhone1); assertTrue("Phone detail 2 is now missing", donePhone2); startSubTest(fnName, "Modifying phone detail in native when it has been deleted in people"); phoneValues.clear(); phoneValues.put(Contacts.Phones.NUMBER, MODIFY_PHONE_TEST1); rowsUpdated = mCr.update(phoneUri2, phoneValues, null, null); assertEquals(1, rowsUpdated); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking contact has not been changed"); peopleCursor.requery(); assertEquals(1, peopleCursor.getCount()); assertTrue(peopleCursor.moveToFirst()); summary = ContactSummaryTable.getQueryData(peopleCursor); assertTrue(summary != null); newContact = new Contact(); status = mDb.fetchContact(summary.localContactID, newContact); assertEquals(ServiceStatus.SUCCESS, status); donePhone2 = false; for (ContactDetail detail : newContact.details) { if (detail.key == ContactDetail.DetailKeys.VCARD_PHONE && detail.nativeDetailId.longValue() == phoneId2) { assertEquals(ADD_PHONE_TEST2, detail.getTel()); assertEquals(ADD_PHONE_PEOPLE_TYPE_TEST2, detail.keyType); donePhone2 = true; break; } } startSubTest(fnName, "Deleting contact in people"); status = mDb.deleteContact(summary.localContactID); assertEquals(ServiceStatus.SUCCESS, status); startSubTest(fnName, "Checking people contact list is empty"); peopleCursor.requery(); assertEquals(0, peopleCursor.getCount()); startSubTest(fnName, "Try adding detail in native"); ContentValues cmValues = new ContentValues(); cmValues.put(Contacts.ContactMethods.PERSON_ID, personId); cmValues.put(Contacts.ContactMethods.DATA, ADD_CM_TEST1); cmValues.put(Contacts.ContactMethods.TYPE, ADD_CM_TYPE_TEST1); cmValues.put(Contacts.ContactMethods.KIND, ADD_CM_KIND_TEST1); Uri cmUri1 = mCr.insert(Contacts.ContactMethods.CONTENT_URI, cmValues); assertTrue("Unable to insert contact into native contact methods table 1", cmUri1 != null); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking people contact list is still empty"); peopleCursor.requery(); assertEquals(0, peopleCursor.getCount()); startSubTest(fnName, "Try modifying detail in native"); phoneValues.clear(); phoneValues.put(Contacts.Phones.NUMBER, MODIFY_PHONE_TEST1); rowsUpdated = mCr.update(phoneUri2, phoneValues, null, null); assertEquals(1, rowsUpdated); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking people contact list is still empty"); peopleCursor.requery(); assertEquals(0, peopleCursor.getCount()); startSubTest(fnName, "Try deleting detail in native"); rowsUpdated = mCr.delete(phoneUri1, null, null); assertEquals(1, rowsUpdated); startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking people contact list is still empty"); peopleCursor.requery(); assertEquals(0, peopleCursor.getCount()); nativeCursor.close(); peopleCursor.close(); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, fnName + " has completed successfully"); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, ""); } @MediumTest @Suppress // Breaks tests. public void testRunDuplicateContactTest() { final String fnName = "testRunConflictTests"; Log.i(LOG_TAG, "***** EXECUTING " + fnName + " *****"); mTestStep = 1; startSubTest(fnName, "Checking people database is empty"); Cursor peopleCursor = mDb.openContactSummaryCursor(null, null); assertEquals(0, peopleCursor.getCount()); assertTrue(Settings.ENABLE_UPDATE_NATIVE_CONTACTS); startSubTest(fnName, "Checking native database is empty"); Cursor nativeCursor = mCr.query(People.CONTENT_URI, new String[] { People._ID, People.NAME, People.NOTES }, null, null, null); assertEquals(0, nativeCursor.getCount()); startSubTest(fnName, "Add first dummy native contact to native"); ContentValues peopleValues = new ContentValues(); peopleValues.put(Contacts.People.NAME, DUP_CONTACT_NAME); Uri personUri1 = mCr.insert(Contacts.People.CONTENT_URI, peopleValues); assertTrue("Unable to insert contact into native people table", personUri1 != null); final long personId1 = ContentUris.parseId(personUri1); ContentValues phoneValues = new ContentValues(); phoneValues.put(Contacts.Phones.PERSON_ID, personId1); phoneValues.put(Contacts.Phones.NUMBER, DUP_CONTACT_NUMBER); phoneValues.put(Contacts.Phones.TYPE, Contacts.Phones.TYPE_MOBILE); Uri phoneUri1 = mCr.insert(Contacts.Phones.CONTENT_URI, phoneValues); assertTrue("Unable to insert contact into native phone table 1", phoneUri1 != null); final long phoneId1 = (int)ContentUris.parseId(phoneUri1); startSubTest(fnName, "Add second dummy native contact to native"); peopleValues.clear(); peopleValues.put(Contacts.People.NAME, DUP_CONTACT_NAME); Uri personUri2 = mCr.insert(Contacts.People.CONTENT_URI, peopleValues); assertTrue("Unable to insert contact into native people table", personUri2 != null); final long personId2 = ContentUris.parseId(personUri2); Contact testContact1 = new Contact(); ContactDetail testDetail1 = new ContactDetail(); VCardHelper.Name name1 = new VCardHelper.Name(); name1.firstname = DUP_CONTACT_NAME; testDetail1.setName(name1); ContactDetail testDetail2 = new ContactDetail(); testDetail2.setValue(name1.toString(), ContactDetail.DetailKeys.VCARD_NICKNAME, null); ContactDetail testDetail3 = new ContactDetail(); testDetail3.setTel(DUP_CONTACT_NUMBER, ContactDetail.DetailKeyTypes.CELL); testContact1.details.add(testDetail1); testContact1.details.add(testDetail2); testContact1.details.add(testDetail3); ServiceStatus status = mDb.addContact(testContact1); assertEquals(ServiceStatus.SUCCESS, status); Contact testContact2 = new Contact(); ContactDetail testDetail4 = new ContactDetail(); VCardHelper.Name name2 = new VCardHelper.Name(); name2.firstname = DUP_CONTACT_NAME; testDetail4.setName(name2); ContactDetail testDetail5 = new ContactDetail(); testDetail5.setValue(name2.toString(), ContactDetail.DetailKeys.VCARD_NICKNAME, null); testContact2.details.add(testDetail4); testContact2.details.add(testDetail5); status = mDb.addContact(testContact2); assertEquals(ServiceStatus.SUCCESS, status); startSubTest(fnName, "Running processor"); runProcessor(); Contact updatedContact1 = new Contact(); status = mDb.fetchContact(testContact1.localContactID, updatedContact1); assertEquals(ServiceStatus.SUCCESS, status); Contact updatedContact2 = new Contact(); status = mDb.fetchContact(testContact2.localContactID, updatedContact2); assertEquals(ServiceStatus.SUCCESS, status); assertEquals(personId1, updatedContact1.nativeContactId.longValue()); assertEquals(personId2, updatedContact2.nativeContactId.longValue()); boolean doneName = false; boolean doneNickname = false; boolean donePhone = false; for (ContactDetail detail : updatedContact1.details) { assertEquals(personId1, detail.nativeContactId.longValue()); detail.syncNativeContactId = fetchSyncNativeId(detail.localDetailID); assertEquals("No sync marker, ID = " + detail.nativeDetailId + ", key = " + detail.key, Integer.valueOf(-1), detail.syncNativeContactId); Integer detailId = detail.nativeDetailId; assertTrue(detailId != null); switch (detail.key) { case VCARD_NAME: assertEquals(DUP_CONTACT_NAME, detail.nativeVal1); assertEquals(DUP_CONTACT_NAME, detail.getName().toString()); assertEquals(personId1, detailId.longValue()); doneName = true; break; case VCARD_NICKNAME: assertEquals(DUP_CONTACT_NAME, detail.nativeVal1); assertEquals(DUP_CONTACT_NAME, detail.getValue()); assertEquals(personId1, detailId.longValue()); doneNickname = true; break; case VCARD_PHONE: assertEquals(DUP_CONTACT_NUMBER, detail.nativeVal1); assertEquals(DUP_CONTACT_NUMBER, detail.getValue()); assertEquals(ContactDetail.DetailKeyTypes.CELL, detail.keyType); assertEquals(phoneId1, detailId.longValue()); donePhone = true; break; } } assertTrue(doneName); assertTrue(doneNickname); assertTrue(donePhone); doneName = false; doneNickname = false; for (ContactDetail detail : updatedContact2.details) { assertEquals(personId2, detail.nativeContactId.longValue()); detail.syncNativeContactId = fetchSyncNativeId(detail.localDetailID); assertEquals("No sync marker, ID = " + detail.nativeDetailId + ", key = " + detail.key, Integer.valueOf(-1), detail.syncNativeContactId); Integer detailId = detail.nativeDetailId; assertTrue(detailId != null); switch (detail.key) { case VCARD_NAME: assertEquals(DUP_CONTACT_NAME, detail.nativeVal1); assertEquals(DUP_CONTACT_NAME, detail.getName().toString()); assertEquals(personId2, detailId.longValue()); doneName = true; break; case VCARD_NICKNAME: assertEquals(DUP_CONTACT_NAME, detail.nativeVal1); assertEquals(DUP_CONTACT_NAME, detail.getValue()); assertEquals(personId2, detailId.longValue()); doneNickname = true; break; default: fail("Unexpected detail: " + detail.key); } } assertTrue(doneName); assertTrue(doneNickname); nativeCursor.close(); peopleCursor.close(); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, fnName + " has completed successfully"); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, ""); } @LargeTest @Suppress // Breaks tests. public void testRunBulkTest() { final String fnName = "testRunBulkTest"; Log.i(LOG_TAG, "***** EXECUTING " + fnName + " *****"); mTestStep = 1; startSubTest(fnName, "Checking people database is empty"); Cursor peopleCursor = mDb.openContactSummaryCursor(null, null); assertEquals(0, peopleCursor.getCount()); assertTrue(Settings.ENABLE_UPDATE_NATIVE_CONTACTS); startSubTest(fnName, "Checking native database is empty"); Cursor nativeCursor = mCr.query(People.CONTENT_URI, new String[] { People._ID, People.NAME, People.NOTES }, null, null, null); assertEquals(0, nativeCursor.getCount()); startSubTest(fnName, "Add " + BULK_TEST_NO_CONTACTS + " dummy native contacts"); List<NativeContactDetails> nativeContactList = new ArrayList<NativeContactDetails>(); for (int i = 0; i < BULK_TEST_NO_CONTACTS; i++) { NativeContactDetails ncd = new NativeContactDetails(); ncd = mTestModule.addNativeContact(mCr, generateNameType(i), (i & 15) == 5, (i & 3), (i & 3), (i & 3), (i & 3)); assertTrue(ncd != null); nativeContactList.add(ncd); } startSubTest(fnName, "Running processor"); runProcessor(); startSubTest(fnName, "Checking people contact list"); peopleCursor.requery(); assertEquals(BULK_TEST_NO_CONTACTS, peopleCursor.getCount()); checkContacts(nativeContactList); nativeCursor.close(); peopleCursor.close(); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, fnName + " has completed successfully"); Log.i(LOG_TAG, "*************************************************************************"); Log.i(LOG_TAG, ""); } private void checkContacts(List<NativeContactDetails> nativeContactList) { for (int i = 0; i < nativeContactList.size(); i++) { NativeContactDetails ncd = nativeContactList.get(i); ContactIdInfo info = ContactsTable.fetchContactIdFromNative(ncd.mId, mDb .getReadableDatabase()); Contact contact = new Contact(); ServiceStatus status = mDb.fetchContact(info.localId, contact); assertEquals(ServiceStatus.SUCCESS, status); LogUtils.logI("Checking contact local ID " + info.localId + ", native ID " + ncd.mId); boolean nameDone = false; boolean nicknameDone = false; boolean noteDone = false; int phonesDone = 0; int emailsDone = 0; int addressesDone = 0; int orgsDone = 0; int titlesDone = 0; for (ContactDetail detail : contact.details) { assertEquals(ncd.mId, detail.nativeContactId); detail.syncNativeContactId = fetchSyncNativeId(detail.localDetailID); assertEquals("No sync marker, ID = " + detail.nativeDetailId + ", key = " + detail.key, Integer.valueOf(-1), detail.syncNativeContactId); switch (detail.key) { case VCARD_NAME: nameDone = true; assertEquals(ncd.mName.toString(), detail.nativeVal1); break; case VCARD_NICKNAME: nicknameDone = true; assertEquals(ncd.mName.toString(), detail.nativeVal1); break; case VCARD_NOTE: noteDone = true; assertEquals(ncd.mNote, detail.nativeVal1); break; case VCARD_PHONE: phonesDone++; for (NativeDetail nd : ncd.mPhoneList) { if (nd.mId.equals(detail.localDetailID)) { assertEquals(nd.mValue1, detail.nativeVal1); assertEquals(nd.mValue2, detail.nativeVal2); assertEquals(nd.mValue3, detail.nativeVal3); break; } } break; case VCARD_EMAIL: emailsDone++; for (NativeDetail nd : ncd.mEmailList) { if (nd.mId.equals(detail.localDetailID)) { assertEquals(nd.mValue1, detail.nativeVal1); assertEquals(nd.mValue2, detail.nativeVal2); assertEquals(nd.mValue3, detail.nativeVal3); break; } } break; case VCARD_ADDRESS: addressesDone++; for (NativeDetail nd : ncd.mAddressList) { if (nd.mId.equals(detail.localDetailID)) { assertEquals(nd.mValue1, detail.nativeVal1); assertEquals(nd.mValue2, detail.nativeVal2); assertEquals(nd.mValue3, detail.nativeVal3); break; } } break; case VCARD_ORG: orgsDone++; for (NativeDetail nd : ncd.mOrgList) { if (nd.mId.equals(detail.localDetailID)) { assertEquals(nd.mValue1, detail.nativeVal1); assertEquals(nd.mValue2, detail.nativeVal2); assertEquals(nd.mValue3, detail.nativeVal3); break; } } break; case VCARD_TITLE: titlesDone++; for (NativeDetail nd : ncd.mTitleList) { if (nd.mId.equals(detail.localDetailID)) { assertEquals(nd.mValue1, detail.nativeVal1); assertEquals(nd.mValue2, detail.nativeVal2); assertEquals(nd.mValue3, detail.nativeVal3); break; } } break; default: fail("Unexpected detail: " + detail.key); } } String nameString = ncd.mName.toString(); if (nameString.length() > 0) { assertTrue("Name was not done", nameDone); assertTrue("Nickname was not done", nicknameDone); } if (ncd.mNote != null && ncd.mNote.length() > 0) { assertTrue("Note was not done", noteDone); } assertEquals(ncd.mPhoneList.size(), phonesDone); assertEquals(ncd.mEmailList.size(), emailsDone); assertEquals(ncd.mAddressList.size(), addressesDone); assertEquals(ncd.mOrgList.size(), orgsDone); assertEquals(ncd.mTitleList.size(), titlesDone); } } private TestModule.NativeNameType generateNameType(int val) { int idx = val % (TestModule.NativeNameType.values().length); return TestModule.NativeNameType.values()[idx]; } }